/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.pp.ws;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.pp.entites.Evenement;
import com.pp.entites.EvenementPK;
import com.pp.services.Evenement_ejbLocal;
import java.io.IOException;
import java.util.List;
import javax.ejb.EJB;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.Consumes;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.enterprise.context.RequestScoped;
import javax.ws.rs.core.MultivaluedMap;

/**
 * REST Web Service
 *
 * @author arnaud
 */
@Path("sortant")
@RequestScoped
public class Sortant {
    @EJB
    private Evenement_ejbLocal evenementEjb;

    @Context
    private UriInfo context;

    /**
     * Creates a new instance of Sortant
     */
    public Sortant() {
    }

    /**
     * Retrieves representation of an instance of com.pp.ws.Sortant
     * @return an instance of java.lang.String
     */
    @GET
    @Produces("application/json")
    public String getJson() {
        MultivaluedMap<String, String> map = context.getQueryParameters();
        String query = map.getFirst("requete");
        if(query == null || query.length()==0){
            return "error - requete vide";
        }
        try{
            ObjectMapper obm = new ObjectMapper();
            JsonNode tree = obm.readTree(query);
            //Recuperation du type de la requete
            String queryType = tree.get("type").asText();
            if(queryType.equalsIgnoreCase("listeEvt")){
                return getListeEvt(tree);
            }else if(queryType.equalsIgnoreCase("getEvt")){
                return getEvt(tree);
            }else if(queryType.equalsIgnoreCase("ACK")){
                return ackEvt(tree);
            }else{
                return "error - type de requete non reconnue";
            } 
        }catch(IOException e){
            System.out.println("Requete mal formée");
            return "error - requete mal formee";
        }
    }
    /**
     * retourne la liste des evenement (sous forme de list<EvenementPK>) à diffuser
     * au mobile qui a demandé
     * @param tree requete envoyée au webservice contenant l'id du mobile demandeur
     * @return 
     */
    private String getListeEvt(JsonNode tree){
        String retour = null;
        String idMobile = tree.get("idMobile").asText();
        List<EvenementPK> list = evenementEjb.getListeEvtADiffuser(idMobile);
        ObjectMapper obm = new ObjectMapper();
        try{
            retour = obm.writeValueAsString(list);
        }catch(Exception e){
        }
        System.out.println("ENVOI DE LA LISTE DES EVENEMENTS POUR "+idMobile);
        return retour;
    }
    /**
     * retourne un evenement au format Json
     * @param tree requete envoyée au webservice contenant l'id de l'evenement demandé
     * @return 
     */
    private String getEvt(JsonNode tree){      
        String retour = null;
        String idCreateur = tree.get("idCreateur").asText();
        int numEvt = tree.get("numEvenement").asInt();
        if(idCreateur == null || idCreateur.length() == 0 || numEvt == 0){
            return("error - mauvais parametres");
        }
        Evenement evt = evenementEjb.getEvenement(idCreateur, numEvt);
    try{        
        retour = evt.getJson();
    }catch(Exception e){}
        System.out.println("ENVOI DE L'EVENEMENTS ("+idCreateur+","+numEvt+")");
        return retour;
    }
    
    /**
     * permet la mise à jour de la bdd du serveur après réception d'un accusé réception
     * @param tree requete envoyée au webservice contenant l'id de l'evenement demandé et l'od du mobile ayant reçu l'evt
     * @return 
     */
    private String ackEvt(JsonNode tree){
        String retour = null;
        String idCreateur = tree.get("idCreateur").asText();
        int numEvt = tree.get("numEvenement").asInt();
        String idMobile = tree.get("idMobile").asText();
        if(idCreateur == null || idCreateur.length() == 0 || numEvt == 0 || idMobile == null || idMobile.length() == 0){
            return("error - mauvais parametres ACK");
        }
        if(evenementEjb.ackDiffusionEvenementToMobile(idCreateur, numEvt, idMobile)){
            retour = "ACK";
            System.out.println("RECEPTION ACK DU MOBILE "+idMobile+" POUR EVT "+idCreateur+" "+numEvt);
        }
        return retour;
    }
    /**
     * PUT method for updating or creating an instance of Sortant
     * @param content representation for the resource
     * @return an HTTP response with content of the updated or created resource.
     */
    @PUT
    @Consumes("application/json")
    public void putJson(String content) {
    }
}
